دليل شامل لتخصيص عروض Django العامة المستندة إلى الفئات لتطوير ويب قوي وفعال. تعلم كيفية تكييف العروض لتلبية احتياجاتك الخاصة.
عرض Django المستندة إلى الفئات: إتقان تخصيص العرض العام
توفر عروض Django المستندة إلى الفئات (CBVs) طريقة قوية وقابلة لإعادة الاستخدام لإنشاء تطبيقات الويب. توفر العروض العامة، وهي مجموعة فرعية من CBVs، حلولاً مُعدة مسبقًا للمهام الشائعة مثل عرض القوائم وعروض التفاصيل وإنشاء الكائنات وتحديثها وحذفها. على الرغم من أن هذه العروض العامة مريحة للغاية، إلا أنها غالبًا ما تتطلب تخصيصًا لتناسب تمامًا الاحتياجات المحددة لتطبيقك. يستكشف هذا الدليل الشامل تقنيات مختلفة لتخصيص عروض Django العامة، مما يمكّنك من إنشاء تطبيقات ويب فعالة وقابلة للصيانة.
فهم عروض Django المستندة إلى الفئات
قبل الخوض في التخصيص، دعنا نلخص أساسيات CBVs والعروض العامة. تعالج العروض التقليدية المستندة إلى الوظائف (FBVs) طلبات HTTP مباشرةً داخل وظيفة واحدة. من ناحية أخرى، تنظم CBVs منطق العرض في فئات، مما يوفر نهجًا أكثر تنظيماً وموجهاً للكائنات. هذا يؤدي إلى تنظيم أفضل للتعليمات البرمجية وقابلية إعادة الاستخدام وقابلية الاختبار.
العروض العامة هي CBVs مُعدة مسبقًا ومصممة للتعامل مع مهام تطوير الويب الشائعة. إنها ترث من الفئات الأساسية مثل View
و TemplateView
وتقدم وظائف متخصصة. تتضمن العروض العامة الشائعة ما يلي:
ListView
: يعرض قائمة بالكائنات.DetailView
: يعرض تفاصيل كائن واحد.CreateView
: يتعامل مع إنشاء الكائنات باستخدام نموذج.UpdateView
: يتعامل مع تحديث الكائنات باستخدام نموذج.DeleteView
: يتعامل مع حذف الكائنات.
توفر هذه العروض العامة أساسًا قويًا، لكن التطبيقات الواقعية غالبًا ما تتطلب تصميم سلوكها. دعنا نستكشف تقنيات التخصيص المختلفة.
تقنيات التخصيص
هناك عدة طرق لتخصيص عروض Django العامة، بدءًا من تجاوز السمات البسيطة إلى تجاوز الأساليب الأكثر تعقيدًا. تعتمد التقنية المناسبة على مستوى التخصيص المطلوب.
1. تجاوز السمات
يتضمن أبسط أشكال التخصيص تجاوز سمات فئة العرض العامة. هذا مثالي لتعديل الخصائص الأساسية مثل النموذج أو اسم القالب أو اسم كائن السياق.
مثال: تخصيص ListView
لنفترض أنك تريد عرض قائمة بالمقالات، ولكنك تريد استخدام قالب مخصص واسم كائن سياق مختلف.
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'articles/article_list.html'
context_object_name = 'articles'
def get_queryset(self):
return Article.objects.filter(is_published=True).order_by('-publication_date')
في هذا المثال، قمنا بتجاوز سمات model
و template_name
و context_object_name
. لقد قمنا أيضًا بتجاوز طريقة get_queryset
لتصفية المقالات وترتيبها حسب تاريخ النشر. تمنحك طريقة get_queryset
التحكم في الكائنات التي يتم تضمينها في عرض القائمة. هذا مفيد لتنفيذ التصفية والترتيب والترقيم.
2. تجاوز الأساليب
يسمح لك تجاوز الأساليب بتعديل سلوك الأساليب الموجودة في فئة العرض العامة. يوفر هذا مزيدًا من التحكم في منطق العرض. تتضمن الأساليب الشائعة التي يجب تجاوزها ما يلي:
get_queryset()
: يتحكم في مجموعة الاستعلامات المستخدمة بواسطة العرض.get_context_data()
: يضيف بيانات إلى سياق القالب.form_valid()
: يتعامل مع إرسال النموذج بنجاح.form_invalid()
: يتعامل مع إرسال النموذج غير صالح.get_success_url()
: يحدد عنوان URL لإعادة التوجيه إليه بعد إرسال النموذج بنجاح.get_object()
: يسترجع الكائن لـ DetailView و UpdateView و DeleteView
مثال: تخصيص DetailView
لنفترض أنك تريد عرض تفاصيل مقال، ولكنك تريد أيضًا تضمين التعليقات ذات الصلة في سياق القالب.
from django.views.generic import DetailView
from .models import Article, Comment
class ArticleDetailView(DetailView):
model = Article
template_name = 'articles/article_detail.html'
context_object_name = 'article'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['comments'] = Comment.objects.filter(article=self.object, is_approved=True)
return context
هنا، قمنا بتجاوز طريقة get_context_data()
لإضافة متغير comments
إلى سياق القالب. يتيح لك هذا الوصول بسهولة إلى التعليقات ذات الصلة وعرضها في قالب article_detail.html
.
3. استخدام Mixins
Mixins هي فئات قابلة لإعادة الاستخدام توفر وظائف محددة. يمكن دمجها مع عروض عامة لإضافة ميزات دون تعديل منطق العرض الأساسي. يوفر Django العديد من mixins المضمنة، ويمكنك أيضًا إنشاء mixins الخاصة بك.
مثال: استخدام LoginRequiredMixin
يضمن LoginRequiredMixin
أن يتمكن المستخدمون الذين قاموا بتسجيل الدخول فقط من الوصول إلى عرض معين.
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = '/articles/' # Replace with your desired success URL
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
في هذا المثال، استخدمنا LoginRequiredMixin
لتقييد الوصول إلى ArticleCreateView
على المستخدمين الذين قاموا بتسجيل الدخول. لقد قمنا أيضًا بتجاوز طريقة form_valid
لتعيين مؤلف المقالة تلقائيًا إلى المستخدم الحالي. يوضح هذا كيف يمكن دمج mixins مع تجاوز الأساليب لتحقيق تخصيص معقد.
إنشاء Mixins مخصصة
يمكنك أيضًا إنشاء mixins الخاصة بك لتغليف المنطق القابل لإعادة الاستخدام. على سبيل المثال، يمكنك إنشاء mixin يقوم تلقائيًا بتعيين المستخدم الحالي كمؤلف لمثيل النموذج، أو mixin يتعامل مع عمليات التحقق من الأذونات.
from django.contrib.auth.mixins import UserPassesTestMixin
class AuthorRequiredMixin(UserPassesTestMixin):
def test_func(self):
return self.request.user.is_staff or (self.request.user == self.get_object().author)
def handle_no_permission(self):
# Replace with your desired redirection or error handling
return redirect('permission_denied') # Or raise an exception
يسمح AuthorRequiredMixin
هذا بالوصول فقط إلى الموظفين أو مؤلف الكائن. يمكنك استخدام mixin هذا مع UpdateView
أو DeleteView
للتأكد من أن المستخدمين المصرح لهم فقط يمكنهم تعديل الكائنات أو حذفها.
4. تخصيص القالب
في حين أن التقنيات المذكورة أعلاه تركز على تعديل منطق العرض، إلا أن تخصيص القالب أمر بالغ الأهمية للتحكم في عرض البيانات. تستخدم العروض العامة قوالب لعرض إخراج HTML. يمكنك تخصيص هذه القوالب لتتناسب مع تصميم تطبيقك وعلامتك التجارية.
اصطلاحات تسمية القوالب
تتبع العروض العامة اصطلاحات تسمية قوالب محددة. على سبيل المثال:
ListView
:<app_name>/<model_name>_list.html
(مثل،articles/article_list.html
)DetailView
:<app_name>/<model_name>_detail.html
(مثل،articles/article_detail.html
)CreateView
/UpdateView
:<app_name>/<model_name>_form.html
(مثل،articles/article_form.html
)DeleteView
:<app_name>/<model_name>_confirm_delete.html
(مثل،articles/article_confirm_delete.html
)
يمكنك تجاوز سمة template_name
في فئة العرض لاستخدام قالب مختلف. داخل القالب، يمكنك الوصول إلى البيانات التي يوفرها العرض من خلال كائن السياق. اسم كائن السياق الافتراضي هو عادةً الإصدار الصغير من اسم النموذج (مثل، article
لـ Article
). يمكنك تغيير ذلك باستخدام سمة context_object_name
.
مثال: تخصيص قالب ListView
في قالب articles/article_list.html
، يمكنك تكرار متغير سياق articles
(كما هو محدد في مثال ArticleListView
أعلاه) لعرض قائمة المقالات.
<h1>Articles</h1>
<ul>
{% for article in articles %}
<li><a href="{% url 'article_detail' article.pk %}">{{ article.title }}</a></li>
{% endfor %}
</ul>
5. تخصيص النموذج (CreateView & UpdateView)
تعتمد CreateView
و UpdateView
على نماذج Django للتعامل مع إدخال المستخدم. يتيح لك تخصيص هذه النماذج التحكم في الحقول المعروضة وقواعد التحقق من الصحة الخاصة بها ومظهرها.
باستخدام form_class
يمكنك تحديد فئة النموذج المراد استخدامها مع سمة form_class
في فئة العرض. إذا لم تحدد فئة نموذج، فسيقوم Django تلقائيًا بإنشاء ModelForm
استنادًا إلى النموذج المرتبط بالعرض.
تجاوز أساليب النموذج
يمكنك تجاوز الأساليب في فئة النموذج لتخصيص سلوكها. تتضمن الأساليب الشائعة التي يجب تجاوزها ما يلي:
__init__()
: تهيئة النموذج وتعديل حقوله.clean()
: إجراء تحقق مخصص عبر حقول متعددة.clean_<field_name>()
: إجراء تحقق مخصص لحقل معين.
مثال: تخصيص نموذج مقال
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'is_published']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['content'].widget = forms.Textarea(attrs={'rows': 5})
def clean_title(self):
title = self.cleaned_data['title']
if len(title) < 5:
raise forms.ValidationError("Title must be at least 5 characters long.")
return title
في هذا المثال، قمنا بتخصيص ArticleForm
عن طريق تعيين سمة fields
في فئة Meta
لتحديد الحقول التي يجب تضمينها في النموذج. لقد قمنا أيضًا بتجاوز طريقة __init__()
لتخصيص عنصر واجهة المستخدم لحقل content
وطريقة clean_title()
لإضافة تحقق مخصص لحقل title
.
6. معالجة النماذج الديناميكية
في بعض الأحيان، تحتاج إلى تعديل النموذج ديناميكيًا بناءً على المستخدم أو عوامل أخرى. يمكنك تحقيق ذلك عن طريق تجاوز طريقة get_form_kwargs()
في فئة العرض. تتيح لك هذه الطريقة تمرير وسيطات الكلمات الأساسية الإضافية إلى مُنشئ النموذج.
مثال: تمرير المستخدم إلى النموذج
from django.views.generic import CreateView
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = '/articles/' # Replace with your desired success URL
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
بعد ذلك، في ArticleForm
الخاص بك، يمكنك الوصول إلى المستخدم من خلال وسيطة الكلمة الأساسية user
في طريقة __init__()
.
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'is_published']
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super().__init__(*args, **kwargs)
if self.user and not self.user.is_staff:
del self.fields['is_published'] # Only staff can publish
في هذا المثال، نقوم بتمرير المستخدم الحالي إلى النموذج وإزالة حقل is_published
ديناميكيًا إذا لم يكن المستخدم موظفًا. يوضح هذا كيف يمكنك تعديل النموذج ديناميكيًا بناءً على أذونات المستخدم.
التخصيص المتقدم: استخدام Viewsets
بالنسبة للتطبيقات الأكثر تعقيدًا، وخاصةً تلك التي تتضمن واجهات برمجة التطبيقات (APIs)، ضع في اعتبارك استخدام مجموعات العرض (ViewSet) الخاصة بإطار عمل Django REST (DRF). تجمع ViewSets بين العروض ذات الصلة (مثل، القائمة، الإنشاء، الاسترداد، التحديث، الحذف) في فئة واحدة، مما يوفر طريقة أكثر نظافة وتنظيمًا لإدارة نقاط نهاية واجهة برمجة التطبيقات.
مثال: إنشاء ArticleViewSet
from rest_framework import viewsets
from .models import Article
from .serializers import ArticleSerializer
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
يوفر ArticleViewSet
البسيط هذا جميع عمليات CRUD (الإنشاء، القراءة، التحديث، الحذف) القياسية للمقالات. يمكنك تخصيص ViewSets باستخدام تقنيات مماثلة للعروض العامة، مثل تجاوز أساليب مثل get_queryset()
و perform_create()
و perform_update()
.
اعتبارات عالمية لتخصيص العرض العام
عند تخصيص العروض العامة لجمهور عالمي، ضع الاعتبارات التالية في الاعتبار:
- التوطين والتدويل (L10n/I18n): تأكد من أن قوالبك ونماذجك تدعم لغات متعددة وتنسيقات إقليمية. استخدم ميزات i18n/l10n المضمنة في Django.
- المناطق الزمنية: تعامل مع تحويلات المنطقة الزمنية بشكل صحيح لعرض التواريخ والأوقات في التوقيت المحلي للمستخدم. استخدم وحدة
timezone
في Django. - تنسيق العملات: قم بتنسيق قيم العملات بشكل مناسب لمناطق مختلفة. ضع في اعتبارك استخدام مكتبة مثل
babel
لتنسيق العملات. - تنسيق التاريخ والرقم: استخدم تنسيقات التاريخ والرقم المناسبة بناءً على لغة المستخدم.
- إمكانية الوصول: تأكد من أن العروض والقوالب المخصصة الخاصة بك يمكن الوصول إليها من قبل المستخدمين ذوي الإعاقة. اتبع إرشادات إمكانية الوصول مثل WCAG.
- التصميم سريع الاستجابة: تأكد من أن قوالبك سريعة الاستجابة وتتكيف مع أحجام الشاشات والأجهزة المختلفة التي يستخدمها المستخدمون حول العالم.
- الحساسية الثقافية: كن على دراية بالاختلافات الثقافية عند تصميم عروضك وقوالبك. تجنب استخدام الصور أو اللغة التي قد تكون مسيئة لبعض الثقافات. على سبيل المثال، يمكن أن يكون لارتباطات الألوان والرموز معاني مختلفة جدًا عبر الثقافات.
مثال: التعامل مع المناطق الزمنية
لعرض تاريخ النشر في المنطقة الزمنية المحلية للمستخدم، يمكنك استخدام علامة timezone
في القالب الخاص بك:
{% load tz %}
<p>Published on: {% timezone article.publication_date %}</p>
تأكد من أن لديك USE_TZ = True
في ملف إعدادات Django الخاص بك.
أفضل الممارسات لتخصيص العرض العام
اتبع أفضل الممارسات هذه لضمان أن تكون التخصيصات الخاصة بك قابلة للصيانة وفعالة:
- اجعل الأمر بسيطًا: تجنب الإفراط في تعقيد التخصيصات الخاصة بك. استخدم أبسط تقنية تحقق النتيجة المرجوة.
- وثق التعليمات البرمجية الخاصة بك: أضف تعليقات لشرح التخصيصات الخاصة بك وسبب ضرورتها.
- اختبر بدقة: اكتب اختبارات الوحدة للتأكد من أن التخصيصات الخاصة بك تعمل بشكل صحيح.
- استخدم Mixins بحكمة: قم بإنشاء mixins قابلة لإعادة الاستخدام لتغليف الوظائف الشائعة.
- اتبع اصطلاحات Django: التزم بأسلوب ترميز Django واصطلاحات التسمية.
- ضع في اعتبارك الأمان: كن على دراية بنقاط الضعف الأمنية المحتملة عند تخصيص العروض. قم بتطهير إدخال المستخدم والحماية من الهجمات الشائعة مثل البرمجة النصية عبر المواقع (XSS) وحقن SQL.
خاتمة
توفر عروض Django العامة المستندة إلى الفئات طريقة قوية ومرنة لإنشاء تطبيقات الويب. من خلال إتقان تقنيات التخصيص الموضحة في هذا الدليل، يمكنك تصميم عروض عامة لتلبية احتياجاتك الخاصة، وإنشاء تطبيقات ويب فعالة وقابلة للصيانة ويمكن الوصول إليها عالميًا. من تجاوز السمات البسيطة إلى تجاوز الأساليب المعقدة واستخدام mixin، الاحتمالات واسعة. تذكر أن تأخذ في الاعتبار وجهات النظر العالمية وأفضل الممارسات لضمان أن تلبي تطبيقاتك احتياجات جمهور دولي متنوع.